import Axios from 'axios'
import Qs from 'qs';
import Vue from 'vue'
import {host} from '@/conf/conf.js';

const urlPre = process.env.NODE_ENV === 'production' ? host+'/' : host+'/';

const HttpRequest = function ({url,data,successCallback,errorCallback,exceptionCallback,option, showMessage=true,method='post'}) {
    Axios({
            method: method,
            url: urlPre + url,
            data:data === null ? {} : data
        }).then((response) => {
        let _data = response.data;
        if (_data.resultCode===0) {
            if(successCallback !== undefined){
                successCallback(_data.responseBody,option,_data);
            }
        }else if(_data.resultCode===noLoginFlag){
            this.$router.push({
                name: 'login',
            });
        }else {
            if (_data.resultCode === 49153) {
                router.replace({ path: '/login' });
                console.log('data', _data.resultCode);
                return;
            }
            if(_data.message !== undefined && '' !== _data.message && showMessage){
                this.$message(_data.message);
            }
            if(errorCallback !== undefined){
                errorCallback(_data);
            }
        }
    }).catch((error)=>{
        if(error.request.status>=500){
            this.$message.error('抱歉，服务异常,请重试');
        }else if(error.request.status>=400 && error.request.status < 500){
            this.$message.error('抱歉，网络异常，请检测你的网络链路情况');
        }
        if(exceptionCallback !== undefined){
            exceptionCallback(error);
        }
    });
};

let MyPlugin = {
    install(Vue, options){
        Vue.prototype.$urlPre = urlPre;
        /**
         * 获取地址
         * @param url 相对地址
         */
        Vue.prototype.$getUrl = function (url) {
            return host + this.$urlPre + url;
        };
        Vue.prototype.$hello = function(){
            console.error('hello');
        }
        /**
         * post 请求(json传递参数)
         * @param {String} url 请求地址
         * @param {Object} data 请求参数
         * @param {Function} successCallback(responseBody,option,_data) 成功返回
         * @param {Function} errorCallback 成功请求，但是返回服务端返回操作错误时调用
         * @param {Function} exceptionCallback 请求失败调用，包括当不限于以下情况：404/500等
         * @param {Object} option 回调参数
         * @param {Object} this this实例 必须
         */
        Vue.prototype.$post = function ({url,data,successCallback,errorCallback,exceptionCallback,option, showMessage=true}) {
            HttpRequest({url,data,successCallback,errorCallback,exceptionCallback,option, showMessage,method:'post'});
        };

         /**
         * get 请求
         * @param {String} url 请求地址
         * @param {Object} data 请求参数
         * @param {Function} successCallback(responseBody,option,_data) 成功返回
         * @param {Function} errorCallback 成功请求，但是返回服务端返回操作错误时调用
         * @param {Function} exceptionCallback 请求失败调用，包括当不限于以下情况：404/500等
         * @param {Object} option 回调参数
         * @param {Object} this this实例 必须
         */
        Vue.prototype.$get = function ({url,data,successCallback,errorCallback,exceptionCallback,option}) {
            Axios.get(this.$urlPre + url,
                {
                    params:data === null ? {} : data
                }
            ).then((response) => {
                let _data = response.data;
                if (_data.resultCode===0) {
                    if(successCallback !== undefined) {
                        successCallback(_data.responseBody, option,_data);
                    }
                }else if(_data.resultCode===noLoginFlag){
                    this.$router.push({
                        name: 'login',
                    });
                }else {
                    if (_data.resultCode === 49153) {
                        router.replace({ path: '/login' });
                        console.log('data', _data.resultCode);
                        return;
                    }
                    if(_data.message !== undefined && '' !== _data.message){
                        this.$message(_data.message);
                    }
                    if(errorCallback !== undefined){
                        errorCallback(_data);
                    }
                }
            }).catch((error)=>{
                console.error('error.response');
                console.error(error.response);
                console.error(error);
                if(error.request.status>=500){
                    this.$message.error('抱歉，服务异常,请重试');
                }else if(error.request.status>=400 && error.request.status < 500){
                    this.$message.error('抱歉，网络异常，请检测你的网络链路情况');
                }
                if(exceptionCallback !== undefined){
                    exceptionCallback(error);
                }
            });
        };


        /**
         * put 请求(json传递参数)
         * @param {String} url 请求地址
         * @param {Object} data 请求参数
         * @param {Function} successCallback(responseBody,option,_data) 成功返回
         * @param {Function} errorCallback 成功请求，但是返回服务端返回操作错误时调用
         * @param {Function} exceptionCallback 请求失败调用，包括当不限于以下情况：404/500等
         * @param {Object} option 回调参数
         * @param {Object} this this实例 必须
         */
        Vue.prototype.$put = function ({url,data,successCallback,errorCallback,exceptionCallback,option, showMessage=true}) {
            HttpRequest({url,data,successCallback,errorCallback,exceptionCallback,option, showMessage,method:'put'});
        };

        /**
         * delete 请求(json传递参数)
         * @param {String} url 请求地址
         * @param {Object} data 请求参数
         * @param {Function} successCallback(responseBody,option,_data) 成功返回
         * @param {Function} errorCallback 成功请求，但是返回服务端返回操作错误时调用
         * @param {Function} exceptionCallback 请求失败调用，包括当不限于以下情况：404/500等
         * @param {Object} option 回调参数
         * @param {Object} this this实例 必须
         */
        Vue.prototype.$deleteReq = function ({url,data,successCallback,errorCallback,exceptionCallback,option, showMessage=true}) {
            HttpRequest({url,data,successCallback,errorCallback,exceptionCallback,option, showMessage,method:'delete'});
        };
    }
}

Vue.use(MyPlugin)